package com.github.MrWub.key;

import java.util.HashMap;
import java.util.Map;

public class KeyOption {
	private Map<Integer, String> keyfor = new HashMap<Integer, String>();
	private boolean isCatch = true;
	
	public boolean isCatch() {
		return isCatch;
	}
	
	/**
	 * 设置是否捕获该玩家的按键, 
	 * 若不启用,则该玩家按键不会唤起事件.
	 * @param isCatch
	 */
	public void setCatch(boolean isCatch) {
		this.isCatch = isCatch;
	}
	
	/**
	 * 得到某个按键所注册的东西 (字符串记号，实际意义不大，只是用来做一个标示)
	 * @param keyNo 按键编号(0~9)
	 * @return 一个字符串,当该按键未注册时返回null.
	 */
	public String getKeySkill(int keyNo) {
		if (keyNo > 9 || keyNo < 0) {
			throw new RuntimeException("KeyNo is too small/big");
		}
		return keyfor.containsKey(keyNo)?keyfor.get(keyNo):null;
	}

	/**
	 * 给该KeyOption注册一个按键
	 * @param skill 所留标示(推荐为插件名),不能为null,""与特殊符号..
	 * @param keyNo 想要注册的编号
	 * @throws RuntimeException 
	 * 当位置已经存在, 使用了特殊字符(空格，井号，美元号($))，keyNo过大过小或skill为null或""时抛出异常.
	 * 
	 */
	public void registerKey(String skill,int keyNo) throws RuntimeException{
		if (keyfor.containsKey(keyNo)) {
			throw new RuntimeException("The keyNo is exist.");
		}
		if (skill == null || skill.isEmpty()) {
			throw new RuntimeException("Skill string can't be null or empty.");
		}
		if (skill.contains(" ") || skill.contains("#") || skill.contains("$")) {
			throw new RuntimeException("can't use ' ', '#' and '$'.");
		}
		if (keyNo>9 || keyNo<0) {
			throw new RuntimeException("KeyNo is too big or small.");
		}
		keyfor.put(keyNo, skill);
	}
	
	/** 
	 * 重写了toString方法 ,
	 * 得到的String可以通过静态的fromString()方法转换回KetOption实例  
	 * 不允许使用的特殊字符(分隔符)：'$', ' ' 还有  '#'.
	 */
	public String toString() {
		StringBuilder sb = new StringBuilder();
		for (int i : keyfor.keySet()) {
			sb.append(i);
			sb.append(" ");
			sb.append(keyfor.get(i));
			sb.append("$");
		}
		return sb.toString();
	}
	
	/**
	 * 将toString得到的字符串转换回KeyOption实例.
	 * 不允许使用的特殊字符(分隔符)：'$', ' ' 还有  '#'.
	 * @param data 字符串.
	 */
	public static KeyOption fromString(String data) {
		String[] arr = data.split("\\$");

		KeyOption result = new KeyOption();
		for (String i : arr) {
			if (!i.equalsIgnoreCase(""))
				result.registerKey(i.split(" ")[1], 
					Integer.valueOf(i.split(" ")[0]));
		}
		return result;
	}
}
